import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;



public class Worker implements Runnable{

	//	LinkedBlockingDeque<Mash> work;
	//	private Maschen maschen;
	Mash aktMash;
	boolean brk = false;

	//	public Worker(LinkedBlockingDeque<Mash> work, Maschen maschen){
	//		this.work = work;
	//		this.maschen=maschen;
	//		}

	@Override
	public void run() {
		while (!Thread.interrupted() && !Main.work.isEmpty()){
			
			aktMash = Main.work.poll();
			if(aktMash == null) break;
			boolean locked = false;
			try{
//				System.out.println("trylock auf aktMash");
				locked = aktMash.tryLock();
				if(locked){
//				aktMash.lock();
					//			brk = false;
					for(Knoten akt : aktMash.getkList()){
						//				if (brk) break;
						List<Knoten> vorList=akt.getVorganger();

						for(Knoten pre : vorList){
//											if (brk) break;
							List<Knoten> mashList= new CopyOnWriteArrayList<Knoten>();
							Mash preMash= pre.getMash();

							try{
//								System.out.println("lock auf preMash");
								preMash.testLock();


								//				preMash.add(pre);
								for(Knoten knotenAusVorMash: preMash.getkList()){
									if(!aktMash.zeigtAufMash(knotenAusVorMash)){
										mashList.add(knotenAusVorMash);
									}
								}
								
								if (!mashList.isEmpty()){
									preMash.removeKnList(mashList);
									Mash neu = new Mash(pre.getCapacity(),mashList);
//									if(!Main.allMash.containsMash(neu)){
									Main.allMash.add(neu);
//									}
									
//									if(Main.allMash.containsMash(preMash)){
										Main.work.add(preMash);
//									}
									Main.work.add(neu);
//									if(Main.allMash.containsMash(aktMash)){
										Main.work.add(aktMash);
//									}
									//				brk = true;
								}
							}finally{
								preMash.unlock();
							}
						}
					}
				}else// kein lock auf aktMash
				{Main.allMash.add(aktMash);}	
			}finally {
				if (locked){
					aktMash.unlock();
					locked = false;
				}
			}
		}
	}

}
